<?php

/*** 4.23 查找两个数组的并集，交集或差集 ***/

// 问题：
// 有两个数组，希望找出它们的并集（两个数组中的所有元素），交集（两个数组中共有的元素）或差集（一个数组中有但并非两个数组共有的）

// 解决方案

$a = ['apple', 'banana', 'lemon'];
$b = ['apple', 'lemon', 'orange'];


// 并集
$union = array_unique(array_merge($a, $b));

// 交集
$intersection = array_intersect($a, $b);

// 简单差集
$difference = array_diff($a, $b);

// 要得到对称差集
$differences = array_merge(array_diff($a, $b), array_diff($b, $a));

var_dump($union, $intersection, $difference, $differences);

/*************************************************************************
 * array_merge() 在合并两个数值时允许有重复的值，所以要用 array_unique() 去重
 * 但这样会在元素之间留下空位，因为 array_unique() 不会压缩数组。
 * 不过，这不是问题，因为 foreach() 和 each() 可以顺利地处理稀疏填充的数组
 */

$old = ['To', 'be', 'or', 'not', 'to', 'be'];
$new = ['To', 'be', 'or', 'whatever'];
$difference = array_diff($old, $new);
// not to

/**************************************************
 * 简单差集
 * array_diff() 函数返回的数组 中将包含 $old 中 但 有 $new 中没有的元素
 */


$old = ['To', 'be', 'or', 'not', 'to', 'be'];
$new = ['To', 'be', 'or', 'whatever'];
$difference = array_diff($new, $old);
// whatever

/**************************************************
 * 逆向差集
 * array_diff() 换句话，要找出 $new 中有 但 $old 没有
 */